package com.ssm.service.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ssm.mapper.ProductObjMapper;
import com.ssm.model.ProductObj;
import com.ssm.service.ProductObjService;

@Service
public class ProductObjServiceImpl implements ProductObjService {

	private Logger logger = Logger.getLogger(ProductObjServiceImpl.class);
	
	@Autowired
	private ProductObjMapper productObjMapper;
	
	@Override
	public JSONObject getAllProducts() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public JSONObject getAllVersionsByProduct(JSONObject paramJson) {
		
		JSONObject res = new JSONObject();
		
		ProductObj productObj = productObjMapper.selectByProductName(paramJson.getString("productname"));
		
		if (productObj == null) {
			res.put("success", false);
			res.put("message", "查询产品结果为空");
			return res;
		}
		
		JSONArray versionsBefore = productObj.getVersions();
		JSONArray versionsAfter = new JSONArray();
		for (Object object : versionsBefore) {
			JSONObject versionTemp = (JSONObject) object;
			
			versionTemp.put("name", "<a href='version.html' onclick='setVERSION(this.text)'>" + versionTemp.getString("name") + "</a>");
			versionTemp.put("case_count", "case_count");
			versionTemp.put("exec_rate", "exec_rate");
			versionTemp.put("pass_rate", "pass_rate");
			versionTemp.put("auto_rate", "auto_rate");
			
			// 以下是表格中的操作按钮，现不在表格中做了
//			StringBuffer sb = new StringBuffer();
//			sb.append("<a href=\"#\"><i class=\"fa fa-eye text-navy\" title=\"查看版本详情\"></i></a>");
//			sb.append("  ");
//			sb.append("<a href=\"#\"><i class=\"fa fa-upload text-navy\" title=\"用例导入\"></i></a>");
//			sb.append("  ");
//			sb.append("<a href=\"#\"><i class=\"fa fa-download text-navy\" title=\"用例导出\"></i></a>");
//			sb.append("  ");
//			sb.append("<a href=\"#\"><i class=\"fa fa-trash text-danger\" title=\"删除版本信息\"></i></a>");
//			sb.append("  ");
//			versionTemp.put("operate", sb.toString());
			
			versionsAfter.add(versionTemp);
		}
		
		res.put("success", true);
		res.put("data", versionsAfter);
		
		return res;
	}

	@Override
	public JSONObject delProduct(String productname) {
		
		// 删除一个产品同时需要删除这个版本下所有的版本表
		
		JSONObject res = new JSONObject();
		
		// 先从数据库查询出这个版本的信息
		ProductObj productObj = productObjMapper.selectByProductName(productname);
		if (productObj == null) {
			
			res.put("success", false);
			res.put("message", "产品" + productname + "不存在，请先创建");
			return res;
		}
		
		// 获取所有的版本号
		JSONArray versions = productObj.getVersions();
		
		// 删除所有版本号对应的表
		for (Object object : versions) {
			
			JSONObject version = (JSONObject) object;
			productObjMapper.deleteProductVersionDB(productname, version.getString("name"));
		}
		
		// 删除产品表中当前产品数据
		productObjMapper.deleteByProductName(productname);
		
		// 执行到这里说明没什么问题了，返回成功
		res.put("success", true);
		res.put("message", "版本删除成功");
		return res;
	}

	@Override
	public JSONObject delProductVersion(String productname, String versionname) {
		
		JSONObject res = new JSONObject();
		
		// 先从数据库查询出这个版本的信息
		ProductObj productObj = productObjMapper.selectByProductName(productname);
		if (productObj == null) {
			
			res.put("success", false);
			res.put("message", "产品" + productname + "不存在，请先创建");
			return res;
		}
		
		// 获取所有的版本号
		JSONArray versions = productObj.getVersions();
		logger.info(versionname);
		
		JSONObject version = null;
		
		// 先判断一下当前创建的版本是否已存在，存在的话直接返回失败信息
		for (Object object : versions) {
			
			version = (JSONObject) object;
			
			if (version.getString("name").equals(versionname)) {
				
				logger.info("找到选择的版本，准备删除");
				
				productObjMapper.deleteProductVersionDB(productname, versionname);
				
				break;
			}
		}
		
		// 更新一下版本信息
		if (version != null) {
			versions.remove(version);
			productObj.setVersions(versions);
		}
		
		int flag = 0;
		
		// 更新版本表中的数据
		flag = productObjMapper.updateByProductName(productObj);
		if (flag == 0) {
			res.put("success", false);
			res.put("message", "更新产品表" + productname + "失败");
			return res;
		}
		
		// 执行到这里说明没什么问题了，返回成功
		res.put("success", true);
		res.put("message", "版本删除成功");
		return res;
	}

	@Override
	public JSONObject addProduct(ProductObj productObj) {
		
		JSONObject res = new JSONObject();
		
		try {
			int flag = productObjMapper.insert(productObj);
			
			if (flag > 0) {
				res.put("success", true);
				res.put("message", "创建产品数据成功");
			} else {
				res.put("success", false);
				res.put("message", "创建产品数据失败");
			}
		} catch (DuplicateKeyException e) {
			res.put("success", false);
			res.put("message", "创建产品数据失败: 重复的版本名");
		}
		
		return res;
	}

	@Override
	public JSONObject addProductVersion(String productname, String versionname) {
		
		JSONObject res = new JSONObject();
		
		// 先从数据库查询出这个版本的信息
		ProductObj productObj = productObjMapper.selectByProductName(productname);
		if (productObj == null) {
			
			res.put("success", false);
			res.put("message", "产品" + productname + "不存在，请先创建");
			return res;
		}
		
		// 获取所有的版本号
		JSONArray versions = productObj.getVersions();
		
		// 先判断一下当前创建的版本是否已存在，存在的话直接返回失败信息
		for (Object object : versions) {
			
			JSONObject version = (JSONObject) object;
			
			if (version.getString("name").equals(versionname)) {
				
				res.put("success", false);
				res.put("message", "创建的版本已存在: " + versionname);
				return res;
			}
		}
		
		JSONObject version = new JSONObject();
		version.put("name", versionname);
		version.put("date", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		version.put("remark", "");
		
		// 更新一下版本信息
		versions.add(version);
		productObj.setVersions(versions);
		
		int flag = 0;
		
		// 更新版本表中的数据
		flag = productObjMapper.updateByProductName(productObj);
		if (flag == 0) {
			res.put("success", false);
			res.put("message", "更新产品表" + productname + "失败");
			return res;
		}
		
		// 创建version数据表
		flag = productObjMapper.createProductVersionDB(productname, versionname);
		logger.info("flag: " + flag);
		// TODO 这里需要修改，判断方式有误
		if (flag == 1000) {
			res.put("success", false);
			res.put("message", "创建版本表" + versionname + "失败");
			return res;
		}
		
		// 执行到这里说明没什么问题了，返回成功
		res.put("success", true);
		res.put("message", "版本创建成功");
		return res;
	}

	public List<ProductObj> searchProduct(JSONObject paramJson) {
		
		ArrayList<ProductObj> res = new ArrayList<ProductObj>();
		
		// 先查询出来所有的数据
		List<ProductObj> productObjs = productObjMapper.selectAll();
		
		String role = paramJson.getString("role");
		
		// TODO 获取一下这个角色可以访问的所有版本名称（空代表没权限，ALL代表有所有权限，其他）
		
		// 然后根据条件进行筛选，返回符合条件的数据
		for (ProductObj productObj : productObjs) {
			res.add(productObj);
		}
		
		return res;
	}

}
